package toolkit;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;


/**
 * <ul>
 * <li>Title: LambdaUtils</li>
 * <li>Description: TODO </li>
 * </ul>
 *
 * @author 程序员ken
 * @date 2021/4/30 0030 上午 9:34
 */
public final class LambdaUtils {
    /**
     * SerializedLambda 反序列化缓存
     */
    private static final Map<String, WeakReference<SerializedLambda>> FUNC_CACHE = new ConcurrentHashMap();

    public LambdaUtils() {
    }


    /**
     * 解析 lambda 表达式, 该方法加了缓存。
     * 该缓存可能会在任意不定的时间被清除
     *
     * @param func 需要解析的 lambda 对象
     * @param <T>  类型，被调用的 Function 对象的目标类型 //SFunction<T, ?> func
     * @return 返回解析后的结果
     */
    public static <T extends Function> SerializedLambda resolve(T func) {
        Class<?> clazz = func.getClass();
        String canonicalName = clazz.getCanonicalName();
        return (SerializedLambda)Optional.ofNullable(FUNC_CACHE.get(canonicalName)).map(Reference::get).orElseGet(() -> {
            SerializedLambda lambda = SerializedLambda.resolve(func);
            FUNC_CACHE.put(canonicalName, new WeakReference(lambda));
            return lambda;
        });
    }


}

